package com.tencent.wxcloudrun.service.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;

@Service
public class SignatureValidationService {
    private String signKey = "e003564e339b4a0f9982182e5865e3a7"; // 从认证接口获得的 signKey
    private String comId = "59080851823593e1a80b"; // 从认证接口获得的 comId

    private final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 校验签名
     *
     * @param method HTTP 请求方法（GET, POST, PUT, DELETE）
     * @param params 请求的参数（GET 请求为查询参数，POST 请求为请求体）
     * @param timestamp 请求的时间戳
     * @param receivedSign 客户端传来的签名
     * @return 是否签名验证通过
     */
    public boolean validateSignature(String method, Map<Object, Object> params, Long timestamp, String receivedSign) throws NoSuchAlgorithmException {
        // 生成待签名字符串
        String signString = generateSignString(method, params, timestamp.toString());

        // 计算服务器端签名
        String serverSign = sha1(signString);

        // 比较客户端传来的签名与服务器计算的签名是否一致
        return serverSign.equals(receivedSign);
    }

    private String generateSignString(String method, Map<Object, Object> params, String timestamp) {
        StringBuilder signString = new StringBuilder();
        Map<Object, Object> sortedParams = new TreeMap<>(params); // 排序参数

//        sortedParams.forEach((key, value) ->{
//            if (key.equals("token") || key.equals("sign")){
//                return;
//            }
        Object cid = sortedParams.get("comId");

        signString.append(cid.toString());
        signString.append(timestamp);
        signString.append(signKey);
//        });
        return signString.toString();
    }

//    /**
//     * 生成待签名字符串
//     *
//     * @param method HTTP 请求方法
//     * @param params 请求参数
//     * @param timestamp 请求的时间戳
//     * @return 待签名的字符串
//     */
//    private String generateSignString(String method, Map<Object, Object> params, String timestamp) throws NoSuchAlgorithmException {
//        StringBuilder signString = new StringBuilder();
//
//        if ("GET".equalsIgnoreCase(method)) {
//            // 对 GET 请求参数按字典顺序排序
//            Map<Object, Object> sortedParams = new TreeMap<>(params); // 排序参数
//            for (Map.Entry<Object, Object> entry : sortedParams.entrySet()) {
//                if (entry.getKey().equals("token")){
//                    continue;
//                }
//                signString.append(entry.getKey()).append(entry.getValue());
//            }
//        }
//
//        // 拼接字符串: {comId}{参数}{timestamp}{signKey}
//        signString.insert(0, comId); // comId 放在开头
//        signString.append(timestamp).append(signKey); // timestamp 和 signKey 放在结尾
//
//        return signString.toString();
//    }

    /**
     * 计算 SHA-1 签名
     *
     * @param input 待签名字符串
     * @return SHA-1 签名
     */
    private String sha1(String input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] result = md.digest(input.getBytes(StandardCharsets.UTF_8));

        // 将字节数组转换为十六进制字符串
        StringBuilder sb = new StringBuilder();
        for (byte b : result) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

}
